<!DOCTYPE html>
<html><head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta name="google" content="notranslate">
  <title>python垃圾回收机制 &middot; LiangHaochen</title>
  <meta name="keywords" content="素锦, inspiration, customization, rainmeter, design, web, 壁纸, 设计, 收集, wallpaper, collection, jaku, icon">
  <meta name="description" content="世界上每个角落都有人过着相似的人生">
  <meta name="author" content="hojun">
  <link rel="icon" type="image/png" href="">
  <link rel="stylesheet" href="/css/diaspora.css">
  <link rel="stylesheet" href="/css/insight.css">
  <link rel="stylesheet" href="/css/custom.css">
</head><body class="loading">
        <div id="loading"></div>
				<div id="nav"></div>
				<div class="nav-user"></div>
    <div id="single">
    <div id="top" style="display: block;">
        <div class="bar">
        </div>
        <a class="icon-icon" href="javascript:history.back()">
        </a>
        <div title="播放/暂停" class="icon-play">
        </div>
        
        <h3 class="subtitle" style="display: none;">
        python垃圾回收机制</h3>
        <div class="social">
            <div>
                <div class="share">
                    <a title="获取二维码" class="icon-wechat" href="javascript:;"></a>
                </div>
                <div id="qr"></div>
            </div>
        </div>
        <div class="scrollbar" style="width: 1.1636%;"></div>
    </div>
    <div class="section">
        <div class="article">
            <div>
                <h1 class="title">
                python垃圾回收机制</h1>
                <div class="stuff">
                    
                    <span>April 9, 2020</span>
                    <span>字数 733</span>
                    
                    
                </div>
                <div class="content">
                    <h3 id="1-引用计数">1. 引用计数</h3>
<pre><code>1）当一个对象的引用被创建或者复制时，对象的引用计数加1；当一个对象的引用被销毁时，对象的引用计数减1.
2）当对象的引用计数减少为0时，就意味着对象已经再没有被使用了，可以将其内存释放掉。
</code></pre><h3 id="2-标记清除">2. 标记－清除</h3>
<pre><code>1）它分为两个阶段：第一阶段是标记阶段，GC会把所有的活动对象打上标记，第二阶段是把那些没有标记的对象非活动对象进行回收。
2）对象之间通过引用（指针）连在一起，构成一个有向图
3）从根对象（root object）出发，沿着有向边遍历对象，可达的（reachable）对象标记为活动对象，不可达的对象就是要被清除的非活动对象，根对象就是全局变量、调用栈、寄存器。
注：像是PyIntObject、PyStringObject这些不可变对象是不可能产生循环引用的，因为它们内部不可能持有其它对象的引用。
</code></pre><p><img src="/%E5%9B%BE%E7%89%871.jpg" alt="图片"></p>
<pre><code>1. 在上图中，可以从程序变量直接访问块1，并且可以间接访问块2和3,程序无法访问块4和5
2. 第一步将标记块1，并记住块2和3以供稍后处理。
3. 第二步将标记块2，第三步将标记块3，但不记得块2，因为它已被标记。
4. 扫描阶段将忽略块1，2和3，因为它们已被标记，但会回收块4和5。
</code></pre><h3 id="3-分代回收">3. 分代回收</h3>
<pre><code>1. 分代回收是建立在标记清除技术基础之上的，是一种以空间换时间的操作方式。
2. Python将内存分为了3“代”，分别为年轻代（第0代）、中年代（第1代）、老年代（第2代）
3. 他们对应的是3个链表，它们的垃圾收集频率与对象的存活时间的增大而减小。
4. 新创建的对象都会分配在年轻代，年轻代链表的总数达到上限时，Python垃圾收集机制就会被触发
5. 把那些可以被回收的对象回收掉，而那些不会回收的对象就会被移到中年代去，依此类推
6. 老年代中的对象是存活时间最久的对象，甚至是存活于整个系统的生命周期内。
</code></pre>
                    
                    <audio id="audio" loop="1" preload="auto" style="width: 100%;" controls="controls">
                        <source type="audio/mpeg" src="">
                        <a href=""></a>
                    </audio>
                </div>
                <div class="comment-wrap">

                </div>
            </div>
        </div>
    </div>
    <div class="relate">
        <ul>
            <h3 id="prev_next">
                <em>相 关 文 章</em>
                <span>
                    <a href="javascript: window.scrollTo(0, 0);">
                    返回顶部</a>
                    
                        <a href="/blogs/three/" rel="prev">上一篇</a>
                    
                    
                </span>
            </h3>
            
            
            
        </ul>
    </div>
</div>
<p style="text-align: center;">
  <a style="color: inherit" target="_blank" href="https://github.com/honjun/hugo-theme-diaspora"></a>
</p>

<script>
  var siteTitle = "LiangHaochen";
</script>
<script src="/js/jquery.min.js"></script>
<script src="/js/plugin.js"></script>
<script src="/js/diaspora.js"></script>
<script src="/js/custom.js"></script>
<script src="/js/InsightSearch.js"></script>
</body>
</html>

